<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.6" />
<title>Release notes for Gerrit 2.4</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }


/*
 * xhtml11 specific
 *
 * */

tt {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

.monospaced {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Release notes for Gerrit 2.4</h1>
<span id="revnumber">version 2.4 (from v2.7-rc2-530-g4d7ac77)</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.4 is now available:</p></div>
<div class="paragraph"><p><a href="http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.4.war">http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.4.war</a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_schema_change">Schema Change</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>WARNING:</strong> This release contains schema changes.  To upgrade:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar gerrit.war init -d site_path</tt></pre>
</div></div>
<div class="paragraph"><p><strong>WARNING:</strong> Upgrading to 2.4.x requires the server be first upgraded to 2.1.7 (or
a later 2.1.x version), and then to 2.4.x.  If you are upgrading from 2.2.x.x or
newer, you may ignore this warning and upgrade directly to 2.4.x.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_features">New Features</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_security">Security</h3>
<div class="ulist"><ul>
<li>
<p>
Restrict visibility to arbitrary user dashboards
</p>
<div class="paragraph"><p>Administrators have some expectation when using the <em>suggest.accounts</em>
visibility restriction feature that users cannot get the names or
email addresses for arbitrary accounts. In fact, because account IDs
are sequential, it would be easy for an adversary to get personal
information of all users on the server by requesting every user&#8217;s
dashboard.</p></div>
<div class="paragraph"><p>This includes changing the meaning of the <em>suggest.accounts</em> config
option to be a boolean indicating whether account suggestion should
happen at all, which is now orthogonal to the account visibility
restriction policy. We still recognize the old values for
<em>suggest.accounts</em>, with the slight behavior change that
<em>suggest.accounts=OFF</em> now means that users cannot access the dashboards
of any other users. Administrators who do not want this behavior can
update their configuration.</p></div>
</li>
<li>
<p>
Indicate that <em>not found</em> may actually be a permission issue
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_web">Web</h3>
<div class="ulist"><ul>
<li>
<p>
Add user preference to mark files reviewed automatically or manually
</p>
<div class="paragraph"><p>Add a checkbox to the preferences header on the diff
screen which allows a user to specify whether they
want manual-reviewing enabled or disabled.  Previously,
every file was auto marked reviewed when a user first
displayed it.  The new manual mode prevents this auto
marking and only marks a file reviewed when the user
explicitly clicks on the reviewed checkbox.</p></div>
</li>
<li>
<p>
Use <em>Auto Merge</em> for merge commit&#8217;s base comparison
</p>
<div class="paragraph"><p>When reviewing a merge commit, the old wording in the version history dropdown
of <em>Base</em> doesn&#8217;t really match Gerrit&#8217;s behavior.  Updating this to use
<em>Auto Merge</em> as suggested by Shawn Pearce on IRC.</p></div>
</li>
<li>
<p>
issue 1035 Add rebase button to the change screen
</p>
<div class="paragraph"><p>This change adds a rebase button along with the rest of
the action buttons in the change page. When pressing the
button, the most recent patch set will be rebased onto
the tip of the destination branch or the latest patchset
of the change we depend upon. A new patch set containing
the rebased commit will be produced and added to the
change.</p></div>
<div class="paragraph"><p>Rebasing of a change in web UI is restricted to change owner, submitter or
those with the (new) <em>rebase</em> permission.</p></div>
</li>
<li>
<p>
Add a new permission <em>rebase</em> to permit rebasing changes in the web UI
</p>
</li>
<li>
<p>
Make a user&#8217;s dashboard visible if any of the changes are visible to the
current user.
</p>
</li>
<li>
<p>
Change <em>Loading &#8230;</em> to say <em>Working &#8230;</em> as, often, there is more going on
than just loading a response.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_performance">Performance</h3>
<div class="ulist"><ul>
<li>
<p>
Asynchronously send email so it does not block the UI
</p>
</li>
<li>
<p>
Optimize queries for open/merged changes by project + branch
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_git">Git</h3>
<div class="ulist"><ul>
<li>
<p>
Implement a multi-sub-task progress monitor for ReceiveCommits
</p>
</li>
<li>
<p>
Close corresponding change when pushing to <em>refs/heads/*</em>
</p>
<div class="paragraph"><p>Gerrit would not close the open changes with matching change-ids,
when the user pushes commits directly to <em>refs/heads/*</em>.</p></div>
<div class="paragraph"><p>This issue could be triggered for two reasons:</p></div>
<div class="olist arabic"><ol class="arabic">
<li>
<p>
It is triggered when Gerrit detects no changes between the
pushed commits and the current patchset on the open changes. This
patch make sure that the matching open change is always closed when
pushing to <em>refs/heads/*</em>, even if no visible changes is detected.
</p>
</li>
<li>
<p>
The same commit exists on another branch than the destination
branch. This could trick gerrit into just "re-closing" the wrong
change.
</p>
</li>
</ol></div>
</li>
<li>
<p>
Run ReceiveCommits in a shared thread pool
</p>
<div class="paragraph"><p>Since the work to ReceiveCommits may take a long, potentially unbounded
amount of time, we would like to have it run in the background so it
can be monitored for timeouts and cancelled, and have stalls reported
to the user from the main thread.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_search">Search</h3>
<div class="ulist"><ul>
<li>
<p>
Add the <em>--dependencies</em> option to the <em>query</em> command.
</p>
<div class="paragraph"><p>This option includes information about patch sets which depend on, or are
needed by, each patch set.</p></div>
</li>
<li>
<p>
Branch Operator: Support full branch names
</p>
<div class="paragraph"><p>The search operator for branches required the provided value to be the
short branch name that is shown in the web interface (without the
<em>refs/heads/</em> prefix). Change the branch operator so that it also
supports full branch names as value.</p></div>
<div class="paragraph"><p>It is intuitive that searching with <em>branch:master</em> and searching with
<em>branch:refs/for/master</em> deliver the same result. So far
<em>branch:refs/for/master</em> was the same as searching with
<em>refs:refs/heads/refs/heads/master</em> which is unexpected for most users.</p></div>
</li>
<li>
<p>
Add comment inclusion via <em>&amp;comments=true</em> over HTTP
</p>
<div class="paragraph"><p>With this change, we can fetch the comments on a patchset by sending a
request to <em>https://site/query?comments=true</em></p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_access_rights">Access Rights</h3>
<div class="ulist"><ul>
<li>
<p>
Added the <em>emailReviewers</em> as a global capability.
</p>
<div class="paragraph"><p>This replaces the <em>emailOnlyAuthors</em> flag of account groups.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_dev">Dev</h3>
<div class="ulist"><ul>
<li>
<p>
issue 1272 Add scripts to create release notes from git log
</p>
<div class="paragraph"><p>These script generates a list of commits from git log between two given commits
and outputs the asciidoc format containing list of commits subject and body.</p></div>
</li>
<li>
<p>
Update URL for m2eclipse
</p>
<div class="paragraph"><p>The project is now under the Eclipse Foundation umbrella.</p></div>
</li>
<li>
<p>
Add missing ignore for m2e prefs in gerrit-ehcache
</p>
</li>
<li>
<p>
Add <em>--issues</em> and <em>--issue_numbers</em> options to the <em>gitlog2asciidoc.py</em>
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_miscellaneous">Miscellaneous</h3>
<div class="ulist"><ul>
<li>
<p>
Remove perl from <em>commit-msg</em> hook
</p>
<div class="paragraph"><p>Removing perl from the commit-msg hook reduces the dependencies
gerrit imposes on its users.</p></div>
</li>
<li>
<p>
updating contrib <em>trivial_rebase.py</em> for 2.2.2.1
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_upgrades">Upgrades</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Updated to Guice 3.0.
</p>
</li>
<li>
<p>
Updated to gwtorm 1.4.
</p>
</li>
<li>
<p>
Update JGit to 1.3.0.201202151440-r.75-gff13648
</p>
</li>
<li>
<p>
Update to gwtjsonrpc 1.3
</p>
<div class="paragraph"><p>The change also shrinks the built WAR from 38M to 23M
by excluding the now unnecessary GWT server code.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_bug_fixes">Bug Fixes</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
issue 904 Users who starred a change should receive all the emails about a change.
</p>
</li>
<li>
<p>
Fix: <em>Diff All Side-by-Side</em> and <em>Diff All Unified</em> buttons
</p>
<div class="paragraph"><p>When pressing the <em>Diff All Side-by-Side</em> or
<em>Diff All Unified</em> button on the change screen, the
opened browser windows/tabs shows diffs using "Base"
as old version and the latest one as active patch set,
regardless what has been set using the
"Old Version History:" drop down menu and what is
currently active patch set.</p></div>
<div class="paragraph"><p>Gerrit doesn&#8217;t remember the base patch set in the URL,
making it impossible to copy-and-paste the URL to
co-workers to show them the same diff a user is
looking at.</p></div>
<div class="paragraph"><p>This change fixes this behavior to make sure that
the opened new browser windows shows diffs using the
correct old patch set and active patch set.</p></div>
</li>
<li>
<p>
Fix NPEs looking up groups by UUID in GroupCache
</p>
</li>
<li>
<p>
Fix default <em>receive.timeout</em>
</p>
<div class="paragraph"><p>This should be in milliseconds, not seconds. Set the default to be
2 minutes in milliseconds and update the documentation to reflect
that milliseconds are the default unit of time used here.</p></div>
</li>
<li>
<p>
Fix <em>development_become_any_account</em> redirects
</p>
</li>
<li>
<p>
issue 1299 Allow configuration of optional pattern for gitweb file history link
</p>
</li>
<li>
<p>
Use servlet context path during logout
</p>
</li>
<li>
<p>
issue 1353 Fix case check for project name so that symlinks work again
</p>
</li>
<li>
<p>
Fix merging of access sections
</p>
</li>
<li>
<p>
Fix inconsistent behavior when replicating refs/meta/config
</p>
</li>
<li>
<p>
Fix duplicated results on status:open project:P branch:B
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_documentation">Documentation</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_access_rights_2">Access Rights</h3>
<div class="ulist"><ul>
<li>
<p>
Capabilities introduced
</p>
</li>
<li>
<p>
Kill and priority capabilities
</p>
</li>
<li>
<p>
Administrate server capability
</p>
</li>
<li>
<p>
Create account capability
</p>
</li>
<li>
<p>
Create group and project capability
</p>
</li>
<li>
<p>
Flush caches capability
</p>
</li>
<li>
<p>
Capability replication and view caches
</p>
</li>
<li>
<p>
Capability view conn. &amp; queue
</p>
</li>
<li>
<p>
Example roles introduced
</p>
</li>
<li>
<p>
Developer example role
</p>
</li>
<li>
<p>
CI system example role
</p>
</li>
<li>
<p>
Integrator example role
</p>
</li>
<li>
<p>
Project owner example role
</p>
</li>
<li>
<p>
Administrator example role
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_miscellaneous_2">Miscellaneous</h3>
<div class="ulist"><ul>
<li>
<p>
User upload documentation: Replace changes
</p>
</li>
<li>
<p>
Add visible-to-all flag in the documentation for cmd-create-group
</p>
</li>
<li>
<p>
Add a contributing guideline for annotations
</p>
</li>
<li>
<p>
Add missing header for suggest.accounts documentation
</p>
</li>
<li>
<p>
Fix anchors for description of gitweb config parameters
</p>
</li>
<li>
<p>
Add missing section name to config-gerrit documentation
</p>
</li>
<li>
<p>
Fix documentation of ls-projects
</p>
</li>
</ul></div>
</div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.4 (from v2.7-rc2-530-g4d7ac77)<br />
Last updated 2013-10-08 10:02:12 PDT
</div>
</div>
</body>
</html>
